package cn.demoncat.util.ocr.tesseract;

import cn.demoncat.util.exception.IoRuntimeException;
import cn.demoncat.util.exec.ExecUtil;
import cn.demoncat.util.io.FileUtil;
import cn.demoncat.util.io.IoUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

/**
 * 图片识别：Tesseract OCR CMD
 *
 * 注：需要先在本地安装Tesseract
 *
 * @author 延晓磊
 * @since 2020年10月23日
 */
public class TessUtil {

    /**
     * 图片识别
     *
     * @param file  文件路径
     *
     * @return 识别文字
     *
     * @author 延晓磊
     * @since 2020年10月23日
     */
    public static String ocr(String file){
        // 输出文件
        String tmp = String.valueOf(System.currentTimeMillis());
        // 图像识别
        ExecUtil.osExec("tesseract " + file + " " + tmp + " -l eng+chi_sim");
        // 读取内容
        File tmpFile = new File(tmp + ".txt");
        String result = FileUtil.readToStr(tmpFile).trim();
        // 删除文件
        FileUtil.delFile(tmpFile);
        return result;
    }

    /**
     * 图片识别
     *
     * @param fileExt   文件扩展名，默认jpg
     * @param file      文件
     * @return 识别文字
     *
     * @author 延晓磊
     * @since 2020年10月23日
     */
    public static String ocr(String fileExt, byte[] file){
       return ocr(fileExt, IoUtil.getInputStream(file));
    }

    /**
     * 图片识别
     *
     * @param fileExt   文件扩展名，默认jpg
     * @param file      文件
     * @return 识别文字
     *
     * @author 延晓磊
     * @since 2020年10月23日
     */
    public static String ocr(String fileExt, InputStream file){
        if (StringUtils.isBlank(fileExt)) {
            fileExt = "jpg";
        }
        // 创建源文件
        String tmp = System.currentTimeMillis() + "." + fileExt;
        File tmpFile = new File(tmp);
        try {
            IoUtil.copy(file, new FileOutputStream(tmpFile));
        } catch (FileNotFoundException e) {
            throw new IoRuntimeException("输出临时文件失败", e);
        }
        // 图片识别
        String result = ocr(tmp);
        System.out.println(tmpFile);
        // 删除文件
        FileUtil.delFile(tmpFile);
        return result;
    }

}
